/** @format */

import Vue from "vue";
/* ---- 过滤器 ----*/
/**
 * 文件大小字节转单位显示
 * @timeStamp {number} 字节大小
 * @format {string} 格式[完整格式：1023 B,1023 KB,1023 MB]
 */
Vue.filter("formatByte", function(byte) {
  if (byte > 1024 * 1024 * 1024 * 1024) {
    return (byte / 1024 / 1024 / 1024 / 1024).toFixed(2) + " TB";
  } else if (byte > 1024 * 1024 * 1024) {
    return (byte / 1024 / 1024 / 1024).toFixed(2) + " GB";
  } else if (byte > 1024 * 1024) {
    return (byte / 1024 / 1024).toFixed(2) + " MB";
  } else if (byte > 1024) {
    return (byte / 1024).toFixed(2) + " KB";
  }
  return byte.toString() + " B";
});
/**
 * 时间戳返回多久以前（刚刚/几秒前/几分钟前/几小时前/几天前/几周前/几个月前/几年前）
 * @timeStamp {Number} 时间戳，单位为毫秒
 */
Vue.filter("timeDiff", function(timeStamp) {
  //将字符串转换成时间格式
  let now = new Date(),
    oldTime = new Date(parseInt(timeStamp)),
    difference = now - oldTime,
    result = "",
    second = 1000,
    minute = 1000 * 60,
    hour = minute * 60,
    day = hour * 24,
    halfamonth = day * 15,
    month = day * 30,
    year = month * 12,
    _year = difference / year,
    _month = difference / month,
    _week = difference / (7 * day),
    _day = difference / day,
    _hour = difference / hour,
    _min = difference / minute,
    _second = difference / second;
  // console.log(new Date(2008, 5, 12, 3, 2, 4).getTime());

  if (_year >= 1) {
    result = parseInt(_year) + "年前";
  } else if (_month >= 1) {
    result = parseInt(_month) + "个月前";
  } else if (_week >= 1) {
    result = parseInt(_week) + "周前";
  } else if (_day >= 1) {
    result = parseInt(_day) + "天前";
  } else if (_hour >= 1) {
    result = parseInt(_hour) + "小时前";
  } else if (_min >= 1) {
    result = parseInt(_min) + "分钟前";
  } else if (_second > 5000) {
    result = parseInt(_second) + "秒前";
  } else {
    result = "刚刚";
  }
  return result;
});
/**
 * 时间戳转日期格式
 * @timeStamp {number} 时间戳
 * @format {string} 格式[完整格式：YYYY-MM-DD HH:mm:ss]
 */
Vue.filter("formatDate", function(timeStamp, format) {
  if (timeStamp) {
    format = format || "YYYY-MM-DD";
    let week = [
      "星期日",
      "星期一",
      "星期二",
      "星期三",
      "星期四",
      "星期五",
      "星期六"
    ];
    let date = new Date(parseInt(timeStamp));
    let o = {
      "M+": date.getMonth() + 1,
      "D+": date.getDate(),
      "h+": date.getHours() % 12,
      "H+": date.getHours(),
      "m+": date.getMinutes(),
      "s+": date.getSeconds(),
      "q+": Math.floor((date.getMonth() + 3) / 3),
      "S+": date.getMilliseconds(),
      "W+": week[date.getDay()]
    };

    if (/(Y+)/.test(format))
      format = format.replace(
        RegExp.$1,
        (date.getFullYear() + "").substr(4 - RegExp.$1.length)
      );
    for (let k in o)
      if (new RegExp("(" + k + ")").test(format))
        format = format.replace(
          RegExp.$1,
          RegExp.$1.length === 1
            ? o[k]
            : ("00" + o[k]).substr(("" + o[k]).length)
        );
    return format;
  }
});

/**
 * desc: 超长字符截取
 * @timeStamp {string} 字符串,{number} 截取长度,{string} 截取后替换字符(默认…)
 * @format {string} 格式[这是一串示例文字…]
 */
Vue.filter("slice", function(data, num = 50, end = "…") {
  if (data && data.length > num) {
    if (end !== "…") {
      return data.slice(0, num);
    } else {
      return data.slice(0, num - end.length) + end;
    }
  } else {
    return data;
  }
});
/* ---- 指令 ----*/
/**
 * Vue 跳转指令'v-jump',基于router.push方式
 * @param name/path 路由名或路径(必传)[eg:home或/home]
 * @param param 参数[eg:{id:123}]
 * @param type  按什么方式传递参数[1-按路由配置方式[eg:home/123]；2-按param方式[eg:{name/path:'',params:{id:123}}]；3-按query方式(默认)[eg:{name/path:'',query:{id:123}}]]
 * 例子：<div class="click-wrap" :data-id="item.id" v-jump="['home_detail', {id:123}, 2]">
 */
Vue.directive("jump", {
  // el: 指令绑定的元素
  // vm: 拥有该指令的上下文 ViewModel
  // expression: 指令的表达式，不包括参数和过滤器
  // arg: 指令的参数
  // raw: 未被解析的原始表达式
  // name: 不带前缀的指令名
  bind: function(el, binding, vnode) {
    // 做绑定的准备工作（比如添加事件监听器，或是其他只需要执行一次的复杂操作）

    /*// 若和v-for指令共用，由于v-for的就地重用机制，需要指定一个唯一的key属性(对应vnode.key)，如果没有指定，这里需要修改
    vnode.key = Math.round(Math.random() * 12568)*/

    el.handler = function() {
      let data = binding.value || null;
      if (data) {
        let vm = vnode.context;
        let pathName = data[0] || null;
        let param = data[1] || null;
        let type = data[2] || 3;
        // console.log('v-jump数据：', pathName, param, type);
        if (pathName) {
          if (type === 1) {
            /*path类型单独处理参数格式*/
            if (param) {
              var pStr = [];
              for (let j in param) {
                if (param.hasOwnProperty(j)) {
                  param[j] ? pStr.push(param[j]) : null;
                }
              }
            }
            vm.$router.push({
              path: "/" + pathName + (param ? "/" + pStr.join("/") : "")
            });
          }
          if (type === 2) {
            vm.$router.push({ name: pathName, params: param });
          }
          if (type === 3) {
            vm.$router.push({ path: "/" + pathName, query: param });
          } else {
            if (pathName.indexOf("/") > -1) {
              vm.$router.push({ path: pathName });
            } else {
              vm.$router.push({ name: pathName });
            }
          }
        } else {
          console.warn("好歹给个页面名啊！");
        }
      } else {
        console.error("v-jump似乎还需要点什么！");
      }
    };
    /*为Dom绑定事件*/
    el.addEventListener("click", el.handler, false);
  },
  update: function(newValue, oldValue) {
    // 根据获得的新值执行对应的更新（对于初始值也会被调用一次）
  },
  unbind: function(el) {
    // 做清理工作（比如移除在 bind() 中添加的事件监听器）
    /*为Dom移除事件*/
    el.removeEventListener("click", el.handler);
  }
});
/**
 * Vue 指令'v-open',打开新页面
 * @param name/path 路由名或路径(必传)[eg:home或/home]
 * @param param 参数[eg:{id:123}]
 * 例子：<div class="click-wrap" :data-id="item.id" v-open="['home_detail', {id:123}]">
 */
Vue.directive("open", {
  bind: function(el, binding, vnode) {
    vnode.key = new Date().getTime() * 3579;
    el.handler = function() {
      let data = binding.value || null;
      if (data) {
        let vm = vnode.context;
        let pathName = data[0] || null;
        let param = data[1] || null;
        // console.log('v-open数据：', pathName, param);
        let routeData = vm.$router.resolve({
          name: "新页面打开",
          path: pathName,
          query: param
        });
        window.open(routeData.href, "_blank");
      } else {
        console.error("v-open似乎还需要点什么！");
      }
    };
    el.addEventListener("click", el.handler, false);
  },
  unbind: function(el) {
    el.removeEventListener("click", el.handler);
  }
});
